﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;
using CasasJusticia.Messaging.Modelo;
using System.Collections.ObjectModel;
using CasasJusticia.Messaging.Contexto.CasasJusticia;

namespace CasasJusticia.Messaging.Contexto
{
    public class Utilidades
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="valores"></param>
        /// <returns></returns>
        public static string ArmarCadenaValoresArray(Array valores)
        {
            if (valores == null)
                return null;
            if (valores.Length <= 0)
                return null;
            string cadena = string.Join(",", valores.Cast<string>().ToArray());
            return cadena;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="valores"></param>
        /// <returns></returns>
        public static string ArmarCadenaValoresList(List<int> lista)
        {
            if (lista == null)
                return string.Empty;
            if (lista.Count <= 0)
                return string.Empty;

            List<string> listado = new List<string>();

            foreach (var valor in lista)
                listado.Add(Convert.ToString(valor));

            string cadena = string.Join(",", listado.Cast<string>().ToArray());
            return cadena;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="valores"></param>
        /// <returns></returns>
        public static Collection<EntidadPorCasa> ArmarColeccionDeArray(Array valores)
        {
            try
            {
                Collection<EntidadPorCasa> coleccion = new Collection<EntidadPorCasa>();

                List<int> codigos = Utilidades.ArmarListaValoresDeArray(valores);

                foreach (var cod in codigos)
                    coleccion.Add(new EntidadPorCasa() { IdCasaJusticia = cod });

                return coleccion;
            }
            catch (Exception e)
            {
                return new Collection<EntidadPorCasa>();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="valores"></param>
        /// <returns></returns>
        public static List<int> ArmarListaValoresDeArray(Array valores)
        {
            if (valores == null)
                return new List<int>();
            if (valores.Length <= 0)
                return new List<int>();

            List<int> codigos = valores.OfType<string>().ToList().Select(x => Convert.ToInt32(x)).ToList();            
            return codigos;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="valores"></param>
        /// <returns></returns>
        public static List<string> ArmarListaValoresDeArray2(Array valores)
        {
            if (valores == null)
                return new List<string>();
            if (valores.Length <= 0)
                return new List<string>();

            //return valores.OfType<string>().ToList();

            List<string> codigos = new List<string>();

            foreach (var valor in valores)
                codigos.Add(Convert.ToString(valor).Replace(" ", ""));
            return codigos;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="source"></param>
        /// <returns></returns>
        public static DataTable ConsultaToDataTable<T>(IEnumerable<T> source)
        {
            PropertyInfo[] propiedades = typeof(T).GetProperties();

            DataTable dataTable = new DataTable();

            foreach (var propiedad in propiedades)
                dataTable.Columns.Add(propiedad.Name, propiedad.PropertyType);

            foreach (var item in source)
            {
                DataRow row = dataTable.NewRow();

                foreach (var prop in propiedades)
                    row[prop.Name] = prop.GetValue(item, null);

                dataTable.Rows.Add(row);
            }

            return dataTable;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="valores"></param>
        /// <returns></returns>
        public static Collection<EntidadPorCasa> EntidadesPorCasa()
        {
            try
            {
                using (EntidadesCasasJusticia contexto = new EntidadesCasasJusticia())
                {
                    var queryEntidadPorCasa = from casasJusticia in contexto.View_EntidadesPorCasasGeo                                                
                                              where casasJusticia.EstEntidadCasa.Replace(" ", "").Equals("A")
                                              orderby casasJusticia.IdCasaJusticia ascending
                                              select casasJusticia;

                    Collection<EntidadPorCasa> entidadesPorCasasJusticia = new Collection<EntidadPorCasa>();

                    foreach (var q in queryEntidadPorCasa)
                    {
                        /*string estadoCasa = !string.IsNullOrEmpty(q.EstEntidad) ? q.EstEntidad.Replace(" ", "") : "";

                        if (estadoCasa.Equals("A"))
                        {*/
                            entidadesPorCasasJusticia.Add(new EntidadPorCasa()
                            {
                                EstEntidad = q.EstEntidad,
                                EstEntidadCasa = q.EstEntidadCasa,
                                IdCasaJusticia = q.IdCasaJusticia,
                                IdDepartamento = q.IdDepartamento.Replace(" ", ""),
                                IdEntidad = q.IdEntidad,
                                IdEntidadCasa = q.IdEntidadCasa,
                                IdLocalidad = q.IdDivisionMunicipal,
                                IdMunicipio = q.IdMunicipio.Replace(" ", ""),
                                NomCasaJusticia = q.NomCasaJusticia,
                                NomDepartamento = q.NomDepartamento,
                                NomEntidad = q.NomEntidad,
                                NomLocalidad = q.NomDivisionMunicipal,
                                NomMunicipio = q.NomMunicipio,
                                TieneLocalidades = q.tiene_localidades,
                                TipoCasaJusticia = q.TipoCasaJusticia
                            });
                        //}
                    }

                    return entidadesPorCasasJusticia;
                }
            }
            catch (Exception e)
            {
                return new Collection<EntidadPorCasa>();
            }
        }

    }
}
